/**
 * 
 * @param {*} nums 
 * @param {*} target 
 */
var fourSum = function (nums, target) {
  if (nums.length < 4) {
    return []
  }
  let res = [], a = 0
  nums.sort((a, b) => { // 排序从小到大
    return a - b
  })
  while (a < nums.length - 3) {
    if (a - 1 >= 0 && nums[a] == nums[a - 1]) {
      a++
      continue
    }
    let b = a + 1
    while (b < nums.length - 2) {
      if (b - 1 > 0 && nums[b] == nums[b - 1] && b !== a + 1) {
        b++
        continue
      }
      let c = b + 1
      let d = nums.length - 1
      while (d > c) {
        if (nums[c] == nums[c - 1] && c !== b + 1) {
          c++
          continue
        }
        if (nums[d] == nums[d + 1] && d + 1 < nums.length) {
          d--
          continue
        }
        if (nums[a] + nums[b] + nums[c] + nums[d] > target) {
          d--
        } else if (nums[a] + nums[b] + nums[c] + nums[d] < target) {
          c++
        } else {
          res.push([nums[a], nums[b], nums[c], nums[d]])
          d--
          c++
        }
      }
      b++
    }
    a++
  }
  return res
}
/**
 * 思路：a,b,c,d四个指针
 * a,b固定左边最小的两个值，c为b右边一个值，d为数组最后一个值
 * res=a+b+c+d，判断四个值和target的大小，如果值小了，则c往右走一步，大了则d往左走一步
 * 如果c，d相遇还没有则b往右边走一步，b走完走a。
 * （以上所有的条件是先对数组排序）
 * 怎么去重？
 * 由于排序了判断指针当前位置数字和上一个位置数字是否相等，相等指针挪动
 * 注意特殊情况不挪指针就行
 */
console.log(fourSum([-5, -4, -3, -2, -1, 0, 0, 1, 2, 3, 4, 5], 0))